package com.cskaoyan.javase.oop2._1extends._2conversion;

import com.sun.org.apache.xerces.internal.util.EntityResolverWrapper;
import javafx.animation.Animation;

/**
 * 学习完Java的继承语法后,就可以学习Java中引用数据类型的类型转换了
 * 这其实也体现了继承的一个用途/好处:
 *      继承打破了Java引用数据类型的类型限制,有了继承,Java出现了引用数据类型的类型转换.
 *      继承是Java引用数据类型能够做类型转换的前提,也就是说
 *      引用数据类型的类型转换,必须发生在父子类之间
 *      如果不是父子类之间做类型转换,就会编译报错
 *
 * -------------------------------------------------------------
 * 1.引用数据类型的类型转换，转换的是什么？
 * 一个引用数据类型变量 = 引用 + 对象
 * 转换的是引用的数据类型,不可能转换对象的类型
 *
 * 2.引用数据类型的类型转换,同样分成两大类:
 *      a.自动类型转换,程序员不需要写任何额外代码,由编译器自动完成类型转换
 *      b.强制类型转换,编译器不会自动完成,需要写特殊强转语法来完成类型转换
 *          语法:
 *         转换后的数据类型 引用 =  (转换后的数据类型)引用;
 *
 * 3.引用数据类型的自动类型转换:
 *      a.条件是什么?
 *      把 子类类型的引用 --> 父类类型的引用 就是一次自动类型转换
 *      这种转换之所以是自动类型转换
 *      还是因为子类"is-a"父类
 *
 *      b.特殊称呼/简称:
 *      引用数据类型的自动类型转换,这太长了,也太拗口了
 *      从继承的方向上来说,假如父类在上,子类在下
 *      引用数据类型的自动类型转换,是从下到上的,是向上的
 *      所以简称为"向上转型"
 *
 * 4.引用数据类型的强制类型转换
 *      a.能够通过编译的条件是什么?
 *      把 父类类型的引用 --> 子类类型的引用 就是一次强制类型转换
 *      需要写特殊语法完成,编译器不会自动完成.
 *      语法:
 *      转换后的数据类型 引用 =  (转换后的数据类型)引用;
 *      注意,这里使用语法完成强转
 *      相当于把一个父类对象当成一个子类对象去使用,这在绝大多数情况下是不可能的
 *      所以这里的语法只是能够通过编译的条件
 *      但是这个强转能否成功呢?
 *      能够成功就不是一定的了,一旦出错
 *      程序就会抛出异常终止,ClassCastException(类型转换异常)
 *      所以强转能够成功还需要一定的条件,关于成功的条件,后续再讲
 *
 *      b.特殊称呼/简称:
 *      引用数据类型的强制类型转换,是从上到下的,是向下的
 *      所以简称为"向下转型"
 *
 *
 * @since 17:39
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {

        Animal a = new Animal();
        Cat cc;
        // 能够通过编译,但不能成功运行
        cc = (Cat) a;


        Cat c = new Cat();
        Animal ac;
        /*
            把子类引用直接赋值给父类引用,那么原先的这个子类引用,就变成父类引用
            引用的数据类型发生了改变
            从子类类型的引用 --> 父类类型的引用
            这其实就是一次引用数据类型的类型转换.
            并且是自动类型转换
          */
        ac = c;
        // 当然以上代码比较啰嗦,可以直接按照下面去写
        Animal ac2 = new Cat();
    }
}

class Animal {
}

class Cat extends Animal {

}